﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using SMA.GENTEv1.Dados;
using System.Data;
using SMA.GENTEv1.Exceptions;
using System.Transactions;

namespace SMA.GENTEv1
{
    public class BeneficioPessoaDocumento
    {
        #region Atributos / Attributes
        private GENTEEntities _context = null;
        private GENTEEntities Context
        {
            get
            {
                if (this._context == null)
                {
                    this._context = new GENTEEntities();
                }
                return this._context;
            }
        }

        private int IdOrganizacao{ get;set; }
        #endregion

        #region Construtores / Constructors
        public BeneficioPessoaDocumento( int idOrganizacao )
        {
            this.IdOrganizacao = idOrganizacao;
        }

        public DataTable CarregarComboAno(int idTipoBeneficio)
        {
            try
            {
                DataTable anoTable = new DataTable();

                anoTable.Columns.Add(new DataColumn { ColumnName = "Ano", DataType = typeof(System.Int32) });
                var anoConsulta = ( from beneficio in this.Context.tab_pessoa_dependente_documento
                                     where beneficio.tab_pessoa_dependente.tab_pessoa.tab_organizacao.Id_organizacao == this.IdOrganizacao
                                     && beneficio.id_tipo_documento_dependente == 15 
                                     select new 
                                     {
                                         ano_beneficio = beneficio.dt_validade.Year
                                     }).Distinct();

                var x = anoConsulta.ToList();

                foreach (var list in anoConsulta)
                {
                    anoTable.Rows.Add( anoTable.NewRow()["Ano"] = list.ano_beneficio );
                }

                return anoTable;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        public IEnumerable<Dependente> CarregarDependentes(int idTipoBeneficio, int idContrato)
        {
            var consulta = (from dependente in this.Context.tab_pessoa_dependente
                            where dependente.tab_pessoa.tab_organizacao.Id_organizacao == this.IdOrganizacao
                            select new
                            {
                                dependente.id_dependente
                            });

            foreach (var dependente in consulta)
            {
                yield return new Dependente(dependente.id_dependente);
            }
        }

        public void Excluir(string caminhoDoc, int idDocumento )
        {
            using (TransactionScope scope = new TransactionScope())
            {
                try
                {
                    var consulta = (from beneficio in _context.tab_pessoa_dependente_documento
                                    where beneficio.id_dependente_documento == idDocumento
                                    select beneficio);

                    var listConsulta = consulta.ToList();

                    string documento = "";
                    foreach (var list in listConsulta)
                    {
                        documento = list.path;
                        _context.DeleteObject(list);
                        _context.SaveChanges();

                        System.IO.FileInfo fileInfo = new System.IO.FileInfo(documento);
                        documento = caminhoDoc + @"\" + fileInfo.Name;

                        if ((documento != "") && (System.IO.File.Exists(documento)))
                        {
                            System.IO.File.Delete(documento);
                        }
                    }

                    scope.Complete();
                }
                catch (Exception ex)
                {
                    throw ex;
                }
            }
        }

        public DataTable SelectPor(int idTipoBeneficio, int ano)
        {
            try
            {
                DataTable gradeProtocolo = new DataTable();
                gradeProtocolo.Columns.Add(new DataColumn { ColumnName = "IdDependenteDocumento", DataType = typeof(System.Int32) });

                gradeProtocolo.Columns.Add(new DataColumn { ColumnName = "Ano", DataType = typeof(Int32) });

                gradeProtocolo.Columns.Add(new DataColumn { ColumnName = "Mes", DataType = typeof(String) });

                gradeProtocolo.Columns.Add(new DataColumn { ColumnName = "NomeDependente", DataType = typeof(String) });

                gradeProtocolo.Columns.Add(new DataColumn { ColumnName = "Path", DataType = typeof(String) });

                var consulta = (from beneficio in this.Context.tab_pessoa_dependente_documento
                                where beneficio.tab_pessoa_dependente.tab_pessoa.tab_organizacao.Id_organizacao == this.IdOrganizacao
                                     && beneficio.id_tipo_documento_dependente == idTipoBeneficio
                                     && ano > 0 ? beneficio.dt_validade.Year == ano : true
                                select new
                                {
                                    beneficio.id_dependente_documento,
                                    beneficio.tab_pessoa_dependente.nome,
                                    beneficio.dt_validade,
                                    beneficio.path
                                });
                
                var listConsulta = consulta.ToList();

                DataRow registro;
                foreach (var list in listConsulta)
                {
                    registro = gradeProtocolo.NewRow();
                    registro["IdDependenteDocumento"] = list.id_dependente_documento;
                    registro["Ano"] = list.dt_validade.Year;
                    registro["Mes"] = list.dt_validade.Month;
                    registro["NomeDependente"] = list.nome;

                    registro["Path"] = list.path;
                    gradeProtocolo.Rows.Add(registro);
                }

                return gradeProtocolo;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        private void VerificaConsistenciaDoCadastro(int idDependente, DateTime dataValidade, string path)
        {
            if (idDependente == 0)
            {
                throw new DataValidationException("É necessário informar a empresa prestadora de serviço!");
            }
            if (dataValidade == null || (dataValidade == DateTime.MinValue))
            {
                throw new DataValidationException("É necessário informar a data");
            }

            if (String.IsNullOrEmpty(path))
            {
                throw new DataValidationException("É necessário informar a imagem!");
            }
        }

        private string ObterNomeImagem(int idOrganizacao, int docto, int idOrganizacaoBeneficio)
        {
            return new TipoDocumento().ObterNomeDocumento(idOrganizacao, docto, idOrganizacaoBeneficio.ToString());
        }

        private int ObterCodigoDocumento(int idTipoBeneficio)
        {
            return new TipoBeneficio().RetornaTipoDocumento(idTipoBeneficio);
        }

        public String SalvarDocumento(int idDependente, DateTime dataValidade, string path) 
        {
            this.VerificaConsistenciaDoCadastro(idDependente, dataValidade, path);

            tab_pessoa_dependente_documento tabBeneficio = new tab_pessoa_dependente_documento();

            tabBeneficio.tab_pessoa_dependenteReference.EntityKey = new EntityKey("GENTEEntities.tab_pessoa_dependente", "id_dependente", idDependente);

            tabBeneficio.dt_validade = dataValidade;
            tabBeneficio.path = String.Empty;
            tabBeneficio.id_tipo_documento_dependente = 15;
            tabBeneficio.obs = String.Empty;

            this.Context.AddTotab_pessoa_dependente_documento(tabBeneficio);
            this.Context.SaveChanges();

            var identity = this.Context.tab_pessoa_dependente_documento.OrderBy(o => o.id_tipo_documento_dependente).FirstOrDefault();

            string returnPath = String.Empty;
            if (identity != null)
            {
                int id =identity.id_tipo_documento_dependente;
                int idTipoDocumento = this.ObterCodigoDocumento(15);

                string nomearquivo = ObterNomeImagem(this.IdOrganizacao, idTipoDocumento, id);

                AtualizarPath(path + nomearquivo, id);
                returnPath = returnPath + nomearquivo;
            }

            return returnPath;
        }

        private void AtualizarPath(string path, int id)
        {
            try
            {
                tab_pessoa_dependente_documento tabBeneficio = (from beneficio in _context.tab_pessoa_dependente_documento
                                                                where beneficio.id_tipo_documento_dependente == id
                                                                select beneficio).FirstOrDefault();
                if (tabBeneficio != null)
                {
                    tabBeneficio.path = path;
                    _context.SaveChanges();
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        #endregion
    }
}
